{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "首先导入一些用到的库。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import tensorflow as tf\n",
    "from tensorflow.examples.tutorials.mnist import input_data\n",
    "from matplotlib import pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "tf.logging.set_verbosity(tf.logging.INFO)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "先来看看数据长什么样子"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Successfully downloaded train-images-idx3-ubyte.gz 9912422 bytes.\n",
      "WARNING:tensorflow:From c:\\users\\donpi\\appdata\\local\\programs\\python\\python37\\lib\\site-packages\\tensorflow\\contrib\\learn\\python\\learn\\datasets\\mnist.py:262: extract_images (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use tf.data to implement this functionality.\n",
      "Extracting ./train-images-idx3-ubyte.gz\n",
      "Successfully downloaded train-labels-idx1-ubyte.gz 28881 bytes.\n",
      "WARNING:tensorflow:From c:\\users\\donpi\\appdata\\local\\programs\\python\\python37\\lib\\site-packages\\tensorflow\\contrib\\learn\\python\\learn\\datasets\\mnist.py:267: extract_labels (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use tf.data to implement this functionality.\n",
      "Extracting ./train-labels-idx1-ubyte.gz\n",
      "Successfully downloaded t10k-images-idx3-ubyte.gz 1648877 bytes.\n",
      "Extracting ./t10k-images-idx3-ubyte.gz\n",
      "Successfully downloaded t10k-labels-idx1-ubyte.gz 4542 bytes.\n",
      "Extracting ./t10k-labels-idx1-ubyte.gz\n",
      "WARNING:tensorflow:From c:\\users\\donpi\\appdata\\local\\programs\\python\\python37\\lib\\site-packages\\tensorflow\\contrib\\learn\\python\\learn\\datasets\\mnist.py:290: DataSet.__init__ (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use alternatives such as official/mnist/dataset.py from tensorflow/models.\n",
      "(55000, 784)\n",
      "(55000,)\n",
      "(5000, 784)\n",
      "(5000,)\n",
      "(10000, 784)\n",
      "(10000,)\n"
     ]
    }
   ],
   "source": [
    "mnist = input_data.read_data_sets(\"./\")\n",
    "\n",
    "print(mnist.train.images.shape)\n",
    "print(mnist.train.labels.shape)\n",
    "\n",
    "print(mnist.validation.images.shape)\n",
    "print(mnist.validation.labels.shape)\n",
    "\n",
    "print(mnist.test.images.shape)\n",
    "print(mnist.test.labels.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "可以看到images里面有数量不等的图片，每张图片是28x28长度的一个一维向量， 所以用的时候需要先给它还原成28x28的二维图片。labels中则是图片对应的数字的值。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x576 with 16 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(8,8))\n",
    "\n",
    "for idx in range(16):\n",
    "    plt.subplot(4,4, idx+1)\n",
    "    plt.axis('off')\n",
    "    plt.title('[{}]'.format(mnist.train.labels[idx]))\n",
    "    plt.imshow(mnist.train.images[idx].reshape((28,28)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "接下来，定义用于训练的网络，首先定义网络的输入。\n",
    "\n",
    "这里我们直接使用上面的数据作为输入，所以定义两个placeholder分别用于图像和lable数据，另外，定义一个float类型的变量用于设置学习率。\n",
    "\n",
    "为了让网络更高效的运行，多个数据会被组织成一个batch送入网络，两个placeholder的第一个维度就是batchsize，因为我们这里还没有确定batchsize，所以第一个维度留空。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From c:\\users\\donpi\\appdata\\local\\programs\\python\\python37\\lib\\site-packages\\tensorflow\\python\\framework\\op_def_library.py:263: colocate_with (from tensorflow.python.framework.ops) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Colocations handled automatically by placer.\n"
     ]
    }
   ],
   "source": [
    "x = tf.placeholder(\"float\", [None, 784])\n",
    "y = tf.placeholder(\"int64\", [None])\n",
    "learning_rate = tf.placeholder(\"float\")\n",
    "\n",
    "def initialize(shape, stddev=0.1):\n",
    "  return tf.truncated_normal(shape, stddev=0.1)\n",
    "\n",
    "L1_units_count = 100\n",
    "\n",
    "W_1 = tf.Variable(initialize([784, L1_units_count]))\n",
    "b_1 = tf.Variable(initialize([L1_units_count]))\n",
    "logits_1 = tf.matmul(x, W_1) + b_1\n",
    "output_1 = tf.nn.relu(logits_1)\n",
    "\n",
    "L2_units_count = 10 \n",
    "W_2 = tf.Variable(initialize([L1_units_count, L2_units_count]))\n",
    "b_2 = tf.Variable(initialize([L2_units_count]))\n",
    "logits_2 = tf.matmul(output_1, W_2) + b_2  \n",
    "\n",
    "logits = logits_2"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "接下来定义loss和用于优化网络的优化器。loss计算使用了sparse_softmax_cross_entropy_with_logits, 这样做的好处是labels可以不用手动做one_hot省了一些麻烦。这里使用了sgd优化器，学习率为可以根据需要设定。\n",
    "\n",
    "试试看，增大减小学习率，换个优化器再进行训练会发生什么。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "cross_entropy_loss = tf.reduce_mean(\n",
    "    tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits, labels=y))\n",
    "\n",
    "optimizer = tf.train.GradientDescentOptimizer(\n",
    "    learning_rate=learning_rate).minimize(cross_entropy_loss)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "需要注意的是，上面的网络，最后输出的是未经softmax的原始logits，而不是概率分布， 要想看到概率分布，还需要做一下softmax。\n",
    "\n",
    "将输出的结果与正确结果进行对比，即可得到我们的网络输出结果的准确率。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "pred = tf.nn.softmax(logits)\n",
    "correct_pred = tf.equal(tf.argmax(pred, 1), y)\n",
    "accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "saver用于保存或恢复训练的模型。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "batch_size = 32\n",
    "trainig_step = 1000\n",
    "\n",
    "saver = tf.train.Saver()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "以上定义的所有操作，均为计算图，也就是仅仅是定义了网络的结构，实际需要运行的话，还需要创建一个session，并将数据填入网络中。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "after 100 training steps, the loss is 0.292644, the validation accuracy is 0.8816\n",
      "after 200 training steps, the loss is 0.20226, the validation accuracy is 0.9184\n",
      "after 300 training steps, the loss is 0.109326, the validation accuracy is 0.9222\n",
      "after 400 training steps, the loss is 0.0968465, the validation accuracy is 0.9306\n",
      "after 500 training steps, the loss is 0.315212, the validation accuracy is 0.9412\n",
      "after 600 training steps, the loss is 0.273173, the validation accuracy is 0.9382\n",
      "WARNING:tensorflow:From c:\\users\\donpi\\appdata\\local\\programs\\python\\python37\\lib\\site-packages\\tensorflow\\python\\training\\saver.py:966: remove_checkpoint (from tensorflow.python.training.checkpoint_management) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use standard file APIs to delete files with this prefix.\n",
      "after 700 training steps, the loss is 0.105101, the validation accuracy is 0.9476\n",
      "after 800 training steps, the loss is 0.346846, the validation accuracy is 0.9504\n",
      "after 900 training steps, the loss is 0.212386, the validation accuracy is 0.9494\n",
      "the training is finish!\n",
      "the test accuarcy is: 0.9533\n"
     ]
    }
   ],
   "source": [
    "with tf.Session() as sess:\n",
    "    sess.run(tf.global_variables_initializer())\n",
    "\n",
    "    #定义验证集与测试集\n",
    "    validate_data = {\n",
    "        x: mnist.validation.images,\n",
    "        y: mnist.validation.labels,\n",
    "    }\n",
    "    test_data = {x: mnist.test.images, y: mnist.test.labels}\n",
    "\n",
    "    for i in range(trainig_step):\n",
    "        xs, ys = mnist.train.next_batch(batch_size)\n",
    "        _, loss = sess.run(\n",
    "            [optimizer, cross_entropy_loss],\n",
    "            feed_dict={\n",
    "                x: xs,\n",
    "                y: ys,\n",
    "                learning_rate: 0.3\n",
    "            })\n",
    "\n",
    "        #每100次训练打印一次损失值与验证准确率\n",
    "        if i > 0 and i % 100 == 0:\n",
    "            validate_accuracy = sess.run(accuracy, feed_dict=validate_data)\n",
    "            print(\n",
    "                \"after %d training steps, the loss is %g, the validation accuracy is %g\"\n",
    "                % (i, loss, validate_accuracy))\n",
    "            saver.save(sess, './model.ckpt', global_step=i)\n",
    "\n",
    "    print(\"the training is finish!\")\n",
    "    #最终的测试准确率\n",
    "    acc = sess.run(accuracy, feed_dict=test_data)\n",
    "    print(\"the test accuarcy is:\", acc)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "下面，用我们训练的模型做一个测试。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From c:\\users\\donpi\\appdata\\local\\programs\\python\\python37\\lib\\site-packages\\tensorflow\\python\\training\\saver.py:1266: checkpoint_exists (from tensorflow.python.training.checkpoint_management) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use standard file APIs to check for files with this prefix.\n",
      "INFO:tensorflow:Restoring parameters from ./model.ckpt-900\n",
      "0.9375\n"
     ]
    },
    {
     "data": {
      "image/png": "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0609reJ1h5WGE2b2daa/6fJByr5r3B5vl+jvNus2L96usTvhj5l+nhevmxr7FpOmY9PzItmybMHxbl9c8Nase1d19eLqH09x8sXZg0cJavWufyvVxLPdpyPtkxP7Vo9ERb50efCynl685gr/gekd5kXcYpWyGsWPZ5REREQh2FASERGFYENJREQUotyNUWZ2audMX/LOx1HzdRp6pTOd+/pPKasTRVflyHnOdOcH/VsnNM41r0aHf7y4OLd2dB5zvv9dC6rFzNfqg43+xMRfY+argz+ixmRk1vRvx7m5x+cx87018mAvbpXPawVKQ8HMOV5853UXOWkL+/jj9HOOfimp33vFUPe2j+YPjAtMle03BvGMkoiIKAQbSiIiohDlruv19yvqONN9qkZ/O0Oz0dvcD5QXn5e2XW9LrKvtOHSP/7swPaHvouIpDLytZebmXZy0wxbv5cVtH5zhxWXhsv+KrsrH7ouQ2wVGsg4+yx++yj5vuZNvVGf/7UxH/HamFxe+1tDJp/6LdZA7daWTVp6WP88oiYiIQrChJCIiClEuul6DD1n+ps//RaRWTW9liOhfgi/Knr2Xm1YJf3txeepuq+hqvh24UyDiwVcnwd8nV8PcQMpcxFKelz3PKImIiEKwoSQiIgrBhpKIiChEuRijXNIj04tbZMUekwy+nDl7vXt7CG8OISKikuAZJRERUQg2lERERCHKRddrmIdWd/Li8UfmerEujf2AayIionjxjJKIiCgEG0oiIqIQbCiJiIhClIsxyla3+G+dOOaWPUNyLkt9ZYiIqELhGSUREVEINpREREQhRPlCYyIioph4RklERBSCDSUREVEINpREREQh2FASERGFSHtDKSKvicg2EZkfZ/52IrJRRApE5KIYeXqJSKHNd1RSK5xkInKhraeKSJvSrk8yiMjdIrLdzle1OP/mL7sevBGSR0Vkk4g8kLzaJl8862h5wm1UDrP1LBSRw0q7PslQ0bdRIL75iSWhhlJE2orI1hJ88aOqmhulvLoislJExhZ9pqpzVLU6gDE7KHOJqlZX1VG2LBGR20VkgYisF5F3RKRm4Ltm2JWm6F++iIwImdf/iMjfdqUYLiJ1A2lPicgaERkvIk0Dn/cVkUHBclR1iJ2fMkVE+ovIZBHJE5HXSlDEu/b332TL6y0i34nIumg7XFVtDeDBOMrtpqq3B+rZR0R+s8tsnIh0CqTliMiTIrLELo/nRSQ7VsGBjbxoHXglkPYfEVkqIvNEpFfg89b2e72XpBZjHU27cr6NNhWRj0XkHxFZJCKXhcxnExH5xC57FZHciPQbRWSVXXe6BD7vISLDg3lV9Ws7Pwt2MD9pJSIdReRbu039KSInFbOIyG20toj8V0RW2H93BzMnsI0eIiI/22U6V0QuiZiPq+x2td7ucw6MVbCIjLbrb9E2OjuQ1s3ux1eJyLWBz7NFZIKINC/h/PxLomeUzwGYlGAZQY8AmJWkss4B0A9ADwC7AKgC4JmiRFXtbFea6gBqwGwU70crSEQ6A3jJltcIwGYAz9u0fQB0B9AYwFgAt9rPawG4AcCdSZqfVFsC4H4AQ5NU3iZb1o1JKg8i0hbAmwAuA1AbwAgAn4hI0ROmbgGwF4AuANoB2BPAwB0U261oPVDVi+z3ZAF42P79VQCeDeR/GsB1qlqQnLlKuXK7jQJ4A8A8mG3uWAAPikjvGGUVAhgF4JTIBBFpAuBCAK0AvAizbIuW8/8BuCYJ85JStq4fA/gUQF0AlwB4Q0TaJVDskwCqAsgFsA+AfiJyfoL1zAbwEcz+shaAMwA8ISLdbPq+ML//qTZ9CICPggeeUfQPbKPtA58/BLOP7QZgoIg0tp9fB2CYqi5MZF6CStxQisiZANYC+CYZFRGR/WF2cK8mozwAfQAMUdWFqroRZgM/Q0SqRsl7MICGAIbFKKsvgBGq+oMt6w4AJ4tIDQC7Ahirqnkwv0Ur+zcPAHhMVdclaX5SSlU/VNXhAFYnqbyJqvo6gLnJKM86EsAYVR2rqvkwy7QpgJ42vQ+Ap1X1H1VdCdOoXVCC76kHYLGqLgXwNewyFZFT7ec/JTgfaVGet1ERqQ6gF4AHVHW7qk4D8AFiLE9VXa6qzyP6QUELAL+o6noElidMA/mJqs5P0vykUgeYg4knVbVAVb8F8CPMgUZJ9YHpOdhsf4MhKNn2ElQXQE0Ar6sxCebAqqjnJxfADFWdouYm/v8BqA+z/y2uXQF8q6qLAfwBoIWItIA5WHoysdlwlaihtN0j9wK4PkpaCxFZayscb3mZMEe+/QEk6wkIYv8Fp3MAtI2S91wAHxR1SUTRGcC0oglV/QvANpizlhkADhKRKgAOBTBDRPYC0F5V30p4LsoIu0xjdpGkqxr49zIVmJ13rPRm9uw+lh9EZJmIfBjorlsJoJ6INANwOMwyrQ5zdnprwnORBjvBNiqBz4LpXVB8fwLoKiK1ARwGszybAzgTwOMlKK80SIzPgt3IJdlGk/H7elR1OYC3AZwvIpn24KolTG8bAIwEkCki+9p16gIAUxH+oO6HbPfqj8FhEAC/ATjCbqe5AP6COTi+SVW3JzIfkUp6Rnkf7JFgZIKqLlDV2qpanP79AQAmqOqUEtYnmpEALhKRXLujvNl+7pxR2jPMUwG8FlJWdQCRZ4brANRQ1d9gzkR/gjlyfQTAIAADRGSAiPwgIm/ajbTcsst07I5zptRXAHqKuTCkEoDbAFSCv0xHArhaRBrYbpgB9vNovQiAORPNhTlaXwLgUxHJUtVCAJfDnMHcAOBimEbnGZgd7nci8kVwrKsMKtfbqKpugDljukNEKovInjBnCrGWZUyquhqmh+dbmC7cG2C20ZsBnCQi34sZC22W+CylzO8AVgC40Y7BHQGz/nq/Rwm20VEAbhGRGmIuLLwAJfh9o3gbZsgpD2bc+vbAergBZn851qbfBeASjf2IuJthegCaAhgMYISItLZpN8Bsp58AuBamC38DgLl2eX4vIqclYX6K31CKyO4wR2VJObUVkV1gNsLbd5Q38DfBi3BiHRUPhVlgo2HO+r6zny+KyHcygH8AfB/ylRthuhOCasIsFKjqk6raTVXPgOmTHwPz214Cc5Y5C2b8jGIQkZGBZdo3Wh5V/R3m7P9ZAEthumxmwl+mDwD4BeYIdRyA4QC2w+xgopX3g6puU9W1AK6G6crpaNO+UdX9VLUnzPjXXjAHU68DOA+mIXolWrmlbSfaRvvCLJOFAF6AGZ+O3H7joqpvq+qeqno0zFlTHsy68jhMF+T7KMNnl/YM6USYhn4ZTE/Beyjh72ENALAFptvyY5hlEbO8eLZREekA4F2Y8edKML1xN4nIsTbLRTANcmebfjbMAeou0cpT1QmqukFV81T1vzAHT8fYtL9V9RhV3dPW/16YxvNxW4fjYcZH60YruzhK8pqtXjBH4QtEBDBnW5ki0slWuLj2AdAEwExbXhUAVURkGYCm0S6aiLxqVERaRclTCHO0cpfNcwSAxfZf0LkA/hdyRAOYjbhbxPflAJgTUY9GAC4FsB/MxjddVbeLyCSYHTHFYHdg8eT7AOZMD/Ys/QLYcSlV3QLTNdjfpl8CYEoxLrxRRHRxiVkpn4XZqdQHkKmqf9v1c7c4y023XtgJtlFV/RvAcYEy3gIwsQT1D9ajCsyVj0fDdPEuVNX1dhu9LZGyU01Vp8Mfj4eIjAPw3wTK+wfmYKSovAcR8vvGuY12ATBbVb+w07NF5DOY3/szmP3oCFUt2neOEpGlAA6A3a53VG1E74a+E8ArqrpcRLoCGKiq60RkEYA2YfMVj5I0lIMBvBOYvgFmo7y8hHUYaf++yBkA/gPghESuLLRHEXVgLibpCOAJAPfajbMoTzMAvWGuogzzJoDxInIQgJ9hjlw+tN1DQTAq5BAAACAASURBVE8AuEtVN4vIPAB7By5KSOZFLUkn5qq6LACZMDvVygDy7UUzJSkvA+aIMdtMSmUAhaq6LcF6doc5Y6wL04CNsGeaEHNrjsKcbe4Lc9HVhTHK6Wzr9ivMjv9+mB105BWdF8FcCDLV/kZVxNyS0gJld5nuFNuoiHSEOcPJA3A6gCNsvljlVYZZfwEgR0Qqq+rWiGwDAbymqktERAG0twe4vVF2lycAQER2gzk4zwBwBczBy2sJlNca5mKvtTC/7SUINMQl9AuAtiJyCEwPQSuYg51HbPokALeLyDMwVzQfBnOtx29R6lcbZjv+HkA+zHp3MCKuUrbbYy+YrlfYcg8RkXUwB0MJ3+ZT7K5Xe4XUsqJ/MN2SW+1VhkUXCoR1t0SWlxdR3joA222ciPoAPoe5TWEkgKGqOjgiTz8A4+3FOQ47DwfZOs6AaUzfhOnGqwGzogbz9wZQW1U/sn8zEeYIaiHMRvhwgvOTagNhumFugekO2YLArRXB3yNOB9syPodpVLYA+DIJ9RwEs2HPtv9fHEhrDdPlugnmSPsWVfW+03YdFZ01NILpnlkPs4PMBXBc8CIAEakP0xNwBwDYg4b+MGNdL8LcOlLm7ETb6JEwy2YNzPZ3VNE82PmIXCe3wMwrYMb0tgS/TETawzQIz9j5WgqzXc6A6TEo6xdq9YM5CFwBM6RzuJqr7QGUaBvtDnOguAHmVou+dl9XYnZfegHMRTXrYRq5YTBX1ALmKtd3YLrb19t8lwYOdm8TkZE2bzbMAexKAKtgtrcTVdW7l9J6DsDVgYO2W2GW5wwADyZhPQVUNa3/ALwMszL/FWf+tjA7xM0AzouRp2invBbAkemep2LO//m2nlsBtCrt+iRpngbC7OzWAqgW59/MtuvB0JA8W2F2yveV9jzuYF52uI6Wp3/cRnGorecWAL1Luz5JmqcKvY3GOz+x/vF9lERERCH4UHQiIqIQbCiJiIhChF71enjGaeyXLSVfFb4f7RLohHGZlp5ULFMuz9LDbXTnE2uZ8oySiIgoBBtKIiKiEGwoiYiIQrChJCIiCsGGkoiIKAQbSiIiohBsKImIiEKwoSQiIgrBhpKIiCgEG0oiIqIQbCiJiIhCsKEkIiIKwYaSiIgoBBtKIiKiEGwoiYiIQrChJCIiChH64uayoqD3nl7cf/B7TtoLbduk7Hs3nLGfM1176iq/TrP/TNn3UvGtPWd/Z3rCwy94cafnrvDiFo9MdPJpfn5qK7YTy2rZ3IsbvrvWi7+f0snJ1+F5P61gxuzUV8zKbNDAmV59tL+vqPPuz16seXlpqxOVTzyjJCIiCsGGkoiIKES56Hr9+8gcL66buTFt37vs2G3O9PZ+/nFF3ePSVg2KIavpLl58352vxMw388rnvfjopw9y0nTDhuRXbCeV1biRM33v6GFe3D670IsPWd3YyVcw44/UViwg2N3ad+zPTtp+lT/y4it/vdRP+GVGyutV3mXWr+dMz36yhRf3ausv38U9tzv5dpZubZ5REhERhWBDSUREFIINJRERUYgyO0Yp2ZW8+JBDppZKHWr8UtmZPv3C7734u9rNnLSCtevSUifyrTiypRcfUXV7zHx7Tj7DixtsnJPSOu1sspo19eJa72520narlOnF7b++zIvbnuuODabTrPtzvfj06qOctD2fusmLd/llXLqqVG6t6H+AF9919f+ctGOrfhn1b06s38eZzl+8JPkVKwU8oyQiIgrBhpKIiChEme163XCS/zSep5s+48Udh/d38rXFhJTVIa+OOtMD6vzuxaNrdHQzs+s15TKqVnWmjxwwNq6/y3mnjj+hGjsj/cuaHv7Td4bnPhczX8eBK7w4nc860v27OdN/HveSF/f89TQnrflQf/stSG21yq3Mdq29+JXrn/Li3Su5TUUholv6Qg1nusml/q1C+UuXJV7BUsIzSiIiohBsKImIiEKwoSQiIgpRZsYotcfuzvRzjwzy4jfW+7cBdBjoXt6fyrGG/Y/4LYWlU3HlHeCOC9/fcEjMvJsL/ccP1nzrp5TVaWcTfCMIAKw8YWvMvHs9fpUXN16YvtstguOSA9/8b8x8Gz9zH6VXbfXclNVpZzHrFn88P3j7T7wmdH/LmZ4z3t8OT379Oiet1QO/eHHh1tjrWVnAM0oiIqIQbCiJiIhClJmu1zW3uk/9aJblX2R+3VXHenH2mikprUdWE7+75tUW7pM9tiuPK0rTvJPj7wo69Y8TA1M7x9NB0mHhoOrO9B/7vObFA1e4wyNNX/XfupHO2y0W96rmxT1y3BsVuow714tbPMOn7+xIZqd2zvTXhz4VmKriRY+sdoc9Jq/13x7ybmt3PxnULvCEtZf7vuCkPTL0BC8unPd3XPUtLdzzExERhWBDSUREFKJUu15XX7y/F7/f9TEn7X/rdvPi7K9T290aNPNe/6q/7ep2KJ07/zAvLlixMm11IuPYvafFTFtXuMWZ3n63/5LhDHa9xk1VnOngNjBhda6TlrllBVIlo4b7hJfZD3Ty4uHHP+HFhch28rU47deU1WlntGof94XMuVn+068uWXiwFy/ab6OTL6OaP1TW/TL/6ucbLn7Pyde3hr+OHOy+YwIjhi3w4pnHlu0n+PCMkoiIKAQbSiIiohBsKImIiEKU6hhlxomrvHiXrBwnbchbR3lxM6T2Mu/Mzu29+I1D/bcP5Kn7MuAFT/iXUlfLS91bS8iXd8zeXvxs05dj5lsU8cqKjO9/iZ6RSuzzDsOd6QtH9/biBRuaePG2Ie4TceK17CD/zS7H7Ou+rP2TXZ4PTPnjkj2mnunkq4M/SvTdFVWBu9tFIfxlMP2lrl5cF+PdfJs2eXGT//P3z+/12dvJd1aNT/0JdW/lWZ7nj0Pr1rz4K10KeEZJREQUgg0lERFRiLR2vWY2aOBMD2z3Wcy8zR5M31M1fr+ithfvleNfDv/cmk5OvmrD2N2absv3zt5xJgB9Pr3GmU7lC713Zg2fqeJMfzfYv6a/dxX3wdVDWnznxRnwbyspfKJkL8d2ykDsMt7e4N/6U++2+F4oTNHVOGVpzLR1R/rdq3Vfja+8O1t+EvFJ7HOxMb908OJ2aybG9wWlhGeUREREIdhQEhERhUhr16tUdR/NcGTVdV68z6RznLTGmJWWOgFA/dx/on7+5ry93HyYEzUfpU6lPdbETJu1zX86SIenVzlp6XxI984k61v3KViDDjzEi+87INdJW3SE3z36Z58XvXhinvt0n7O/vCyu7277P//Kx8/eHxoz36Mzj/TiptNmxMxHO7ZhWBP3g85+eF4nf/jih733cbKt3MN/eL4e5+8/u2S7Xaiztvt3DnQOPCAdAD46+hkvvnm/i/2En6bvuOJpxjNKIiKiEGwoiYiIQrChJCIiCpHWMcrCf9Y60/et3NOL/9N6spP2Q5PWXpzsp8lntWzuTP+4+zuBKf/YYctP9SP+kmOU6bD1OH88ZPLewZe9ui9unr29oRcXzPkr1dWqkPKXLffiqh8ud9LafejHx1y2J2Jph/gu/c/Yzb9dIHirCADcv6qLF7e82r+2IeKBTFRMjT+Z50zPuXWbF99Yb6YX3zzcvWYk1u07Z/x1rDO9ZYB/S+BJb4920s6vudCL/xrg73db/7SDSpcCnlESERGFYENJREQUIr1drxs2ONNfLva7Wsbs/paTtvTTWn7aS/ujuNZ2crsGquf63TX77TLfrVeM53lIyR4wQgnaUt/vYs2WzJj5bppyshfvirJ3STkVz4K7/GUd2bX35QP+S4SrLyyDfXPlVOSw1iU3+k+4evVx/wXZ7bKruX8YeMB5my/9Wzs69P/dyVa4ye++ffjbPk7ahSf6wyqP7OX347/Sze2+LZyWvlsFY+EZJRERUQg2lERERCHYUBIREYUo1Rc317nHf6Rdz7vPctI+6vKaFz9yl/vS0HhMznPHtgoCxwR7VdoWkVsQTYtnfnWm+WaC9Mg7cW3Uz4OPrAOAZq/E92YRKptWXeJeezB9v+e8eH7+FietysrIbZZSofr7/mPrzsd1XvzP6e62t3Wd/8bnjjf6t2YVBF7oHKn9LTOd6UPb+tcYfNV5mBffdZd7/tb0ZJQ6nlESERGFYENJREQUolS7XjHR79qsdYyb1K/XAC9e2zYHxVXv5djdtYs/7OxMT9n3taj5Im9nodTIbNfamZ689xvBVC8aubGLky/7a/dNF1S+bD58Y8y0U6de5Ew3/O7nVFeHIgS7Yau/HztfvG/qidyfrv8osD0HdsmP7DbMyfd8k15enOyntMWLZ5REREQh2FASERGFKN2u1xCZo/2ulnqjk1v2lvk13A/2jZ5Pe+zuTMuPU5NbEQIALO/d0JmO9TSeZ7873JluiwlR81H58FL3153ppQX+lZX1nqqa7upQmjV4yX9Y/r5H/8eLJ3R3n9J29Q25Xtz6ena9EhERlTlsKImIiEKwoSQiIgpRZscoUyriQTwZMY4XOCaZHlvrRn8yEgBMyfOfyNLxkUVOGl/aW/4suvUAL+6R497y8VOePy6ZydtBdn6F/o0l9f7PX/arXnefyjTrTP+JTX3eOsdJ0ykzUlQ5F88oiYiIQrChJCIiClExu14jXsgc68XNlB4ND1kcM+2T9Xt4ccHKVemoDqVQ37O+8eLIlzNfOPk8L24J94UEmfXq+hMN63lhwaw/kltBKhUZ3//ixb3+e6OTNvMCv+t1wwNut2zN0/xb/VL5JDWeURIREYVgQ0lERBSCDSUREVGICjlGWVg59pjkyoK8NNak4pIc/40wJ+wyLWa+1duqe7HmcdnszAoL/OP2Ff0PcNKOvWiMFw+f28SLy8JLfSm52gxe6Ey/flpjL/6h6wdO2lHdLvDijLGpu52PZ5REREQh2FASERGFqJBdr28c9aIzPWub3xV71ms3eXELjEtbnSqcAv+pHINnHegkXXPAfC8evbCNFzdFep7CQaVj1sGvenHhwe6tI51/8LvY2ty9yYvjfWkwlR/5C90ncL13Uk8v7vf1u07aqhu3enHDsamrE88oiYiIQrChJCIiClEhu17vnXe8M73p+aZe3GIYu1vTQfP9R5rn3rLJSev4UD8vlqkRL9mmcu2L2/1utJm3NnHSxk/o4MUdBi1x0lovm+3FBVu3giqO4NOXzph7hJM2Yo9XvPjC/a7wE36antQ68IySiIgoBBtKIiKiEGwoiYiIQlTIMUoc6l5+XA2LYmSkdCj4c54z3eK0UqoIpVzlERO9eOUIN60NfvJivpSbotl8knvb0IRxu3jxmvbVvLjOT0gqnlESERGFYENJREQUomJ2vRIRUblTsGq1Mz24XSsvroPxKftenlESERGFYENJREQUgg0lERFRCDaUREREIdhQEhERhWBDSUREFEJUdce5iIiIKiieURIREYVgQ0lERBSCDSUREVGItDeUIvKaiGwTkflx5s8RkY0isl1E7o+RJ1dE1Oa7JKkVTjIROczWs1BEDivt+iSDiNxtl89GEam2478AROQvux68EZJHRWSTiDyQvNomXzzraHlSgm20nZ3/AhG5KEaeXnad3ygiRyW1wkkmIhfaeqqItCnt+iQDt9HEttESNZQiMlpEttov3igis4tZxKOqmhtR5mEi8rP90ReKyOkAoKp5qlodwJtxlFtbVQcHyrxIRP60dRwlIrsE0kYG6r/RrhC/hszzoSLyu4hsFpHvRKRlIO1GEVklIr+JSJfA5z1EZHiwHFX92s7PgjjmJ21EpKOIfCsi6+xvdlIxi3hXVaur6iZbXm0R+a+IrLD/7g5mVtXWAB6Mo9xuqnp7oJ597O+8UUTGiUinQNqZIjLbzsMK+/01Q+Y5U0TuF5ElIrJBRH4Rkdo27VARmSciS0XkjMDf1LbraY3AvBRnHU0LEakrIh/Z7elvEflPMYtwtlG7oxkqIutFZJmIXFeUpqpz7PyP2UGZS+w6MsqWKSJyu4gssOW+E1xeItJURD4WkX9EZJGIXBZPxUXk1chGTkSeEpE1IjJeRJoGPu8rIoOCf6+qQ+z8lDl2HZ9ll+tfInJQMf7c2UZteXuKyA92e1ouIlcXpaViG7XprUTkU7vNrRKRR0Pmd7DdpgtF5LyItLRto4mcUfa3P3p1VW2fQDmwP+RbAG4HUAvA7gCmJFhmT5iFfAKAugDmAXi7KF1Vjw7UvzqAcQDej1FWfQAfArjDljUZwLs2rQmACwG0AvAigIft51kA/g/ANYnMRzrYun4M4FOY+bsEwBsi0i6BYp8EUBVALoB9APQTkfMTrGdbmBX9MgC1AYwA8ImtPwD8CKCHqtaCWR5ZAMKOHu8BcACA/QHUBNAPwFab9hSAPgCOAvCCiGTazx8C8LCqbkhkXtLgOQDbADQC0BdmHjonUN7dANoCaAmgN4CbJPEzw3NgfvMeAHYBUAXAM4H0N2C220YAjgXwoIj0DitQRA4E0Dris30AdAfQGMBYALfaz2sBuAHAnQnOR1qIyOEAHgFwPoAaAA4GMDeB8uoDGAXgJQD1ALQB8GWCdQzdRkWkEoCvAHwLszyawSznWKYBuALAz1HS0raNlpUxyoEAXlLVkaqar6qrVfWvBMvsA+B9VZ2hqtsA3AfgYBFpHZlRRHIBHATg9RhlnQxghqq+r6pbYXYa3USkA4AWAH5R1fUAvobZQQOmgfxEVecnOB/p0AFmR/Wkqhao6rcwjU6/BMrsA3NWstn+BkMAXJBgPY8EMEZVx6pqPsxOoymAngCgqgtVdVUgfwHMxv8vIlIHZhldrKp/q/GbXb4AUM1OT4NpcOrZHe6uqvpegvORUmK61k4BcIeqblTVsQA+QWLL8xwA96nqGlWdBeBlAOclWNU+AIbY5bYRZnmeISJVRaQ6gF4AHlDV7XY5fICQdcjujJ8B0D8iaVcAY1U1D8A38LfRBwA8pqrrEpyPdLkHwL2q+pOqFqrqYlVdnEB51wH4QlXftGdcG+yyTUToNgqzzixR1SdUdZOqblXV6bEKU9XnVPUb+AewQWnbRhNpKB+yp80/ikivog9FpIWIrBWRFsUoaz/7t7/a0+g3RKRuAnUDALH/gtMA0CVK3nNgFu68GGV1hjmyAQDYrou/7Od/Auhqu+wOAzBDRJoDOBPA4wnNQfpIjM+C3chr7dF6Sct1yiuhaMs0sp4Hisg6ABtgGounYpTVFUA+gFNtV+IcEbkykL5CRLqJSDcAhQDW2LIGJDgP6dAOQIGqzgl8Ng1mfS32NmoPKnZBYBsIlpeAaMszB+bMVQKfBdPD1qFrAfwQZcc7A8BBIlIFwKEw2+heANqr6lsJ1D9t7NnSXgAaiBkaWSQiz9p5KspT3G10PwD/2O7RFSIyopj77ahVRfg2uh+A+WKGvlaJGcbrWsLvSts2WtKG8maYo7KmAAYDGFF0pqaqC1S1tqoWZwyuGczR7ikwG0lkF0xJfA7gdBHZza5MdwJQmO7ASOcAeC2krOoAIo861wGooaqrYY5Mv4XpHroBwCCY3+gkEfnejrM0S2RmUux3ACsA3Cgi2SJyBMwRoPdb2WU6thhljgJwi4jUsGNFFyD6b18cXwHoKebCkEoAbgNQKaKeY23XazMAjwGYH6OsZjDd/O1gzjhOBXC37d4CTNfRIJj1ux+Ay2HORiqLyBdixql7/rvYMiHm+gqUaBstGq8LlumVl4CRAC4SczFeLZhtBgCq2m6zHwHcISKVRWRPmP1D1HXIHpxeiijdqKr6G4BhAH6C6QF6BGbZDhCRAXaM7k17sFtWNQKQDbOeHgQzPLUHTG8cgBJto80AnAvgapjfxRmeKqEdbaPNYE4inoY5+PoMwMc2b3GlbRstUUOpqhPsaXqeqv4XZoU+JoF6bAHwqr0oYCPM2GLM8kRkhvgX4UQdzLan63fBbCB/w+wwNwBYFFHWgTB95R+E1G8jzBhWUE1bHlT1bVXdU1WPhjlyygPwC8wZZR+Ysc8ye3apqtsBnAjT0C8DcD2A9xDxWxXTAJjl+gfM+OfbYeWJe3FV3xj1/B1mw34WwFIA9QHMjFau7ZIaBeCdGF+5xf5/r6pusWch78Cud6o6VVV7qeq+9jsugFkvX4HpAjsfwOsiEu1svLSFrq8lLK+ojLjKE/dCuVhnKUNh1ovRMGd939nPi5ZnX5iDmIUAXoAZ+4q1Dj0FsyyjdqOq6pOq2k1VzwBwBsyFRxkw4/GHApgF4JZY81MGFK2vz6jqUjvE8AQS3+9+pKqT7JDDPQAOsAct/5KkbXQLTDf4SDsk9jjM+GjH4lY+ndtossYoFdG77+I13ZYR35epdg5ciBPzSjvbv91WVRvCNJhZAH6LyHYugA9tAx3LDADdiibsGFBr+zkCn1eBWVDXw5wZL7Rjl5MA7Bbv/JUGVZ2uqj1VtZ6qHgnTYzAxgfL+UdW+qtpYVTvDrGsxy1P34qqYV6ap6geq2kVV68EcCLWE+X2jyULEhR0BRd1z8ax3TwIYqKpbYLpsJ9tx12wADeL4+3SbAyDLXlhRpBsi1td4qeoamJ1et8DHoeUFlmX1WGeudpztLlXNVdVmtrzF9h/UjB0fp6oN7M6wHmKvQ4cCeMx2oy+zn42XiKt9RaQRzJnnvTAHtdPtgWKZ3kbtMliEYuwn4xC53y2Ko+7Lk7SNFmtfXwwp3UaL3VCKufT2SNsdkmWPLA4G8EUC9XgVwPliLhuuCtMF82kC5cHWr4sYLWBOzwfZFa4oTxUApyG82xUAPgLQRUROEZHKMN070+3RU9BAAK+p6hKY2z/a2w2zNxK4Oi0dbBd1ZTEXUtwAoAl2/LuElddaROqJuQXjaJgj94TvMRSR7rbMBjBX640oWg5iLvVvYZd5S5gu8W+ilaPmYrExAG4Xc+tDR5gzDWe9s12xlVW16PN5AA4RcwVpDoDVic5Tstkx9A8B3Csi1USkB8zV37EuVovH/wAMFJE6Yi5iuxgJrB+AdwtLa7u8OsGcId2rqoU2vaPtuq8kImcDOMLmiaYdTOO9u/0HmN6cjyLyPQHgLlXdDLMs9xb/wqEyvY3C7CevEpGG4l+Mlsh+8lWY4aHdRSQb5qr+saq6NpFKhm2jMFe47ifmdsBMOw+rYM7oo5VVye5zBUC23UdlRORJ/TaqqsX6B9M6T4LpdlkL0+9/eCC9BUxXTYsYf/8agPujfH4PgJX23+sA6sTzdzYtF+YoJSvwWW2Yo5dNMN2JDwHIjPi7s2C6ZSVKmTMA9A1MHwYzlrcFpqsoNyJ/e/u7BOtwI8xKMBNA14j88wEcVtzfP1X/YMbz1thlNxJAm4j0jQAOivG3dwN4I+Kz0wEsAbAZwFQAR8bzdxHpGqUeY+269w/MRlgtkPYAzFH3Jvv/YAD1AukjAdwWmG4K0z27EWYneWnEd+XYurcMfHaoXXZLAZwZ7zpaCsuzLoDh9rdYAOA/gbRib6P2txgKYD2A5QCui/J3owFcFKPMXgAWRXzWDsBsu478HVkmzE50pZ2HsQD2KsY6GW3d6Q3gs4jPnrLr/U8Amu2ojFJeptkAnofZ7y6DGeerHOfvEXVbgxnXW2x/gxEAmsfzdzv4nWNuozb9ZJiLINfbdaZzIC1yGx1tvyP4r1fEepnybbQ0FvbLdoH+FWf+HLtibII5EoyWpyXM5cNrYS73L/WVOmR+DrX13AKgd2nXJ0nzNNAun7WRG0XI38y268HQkDxbYS4aua+053EH87LDdbQ8/SvBNtrWzv9mAOfFyHOwXefXIspBU1n6BzO2tdauf61Kuz5Jmiduowlso3zNFhERUYiy8sABIiKiMokNJRERUQg2lERERCGywhIPzziNA5il5KvC91NyIzuXaelJxTLl8iw93EZ3PrGWKc8oiYiIQrChJCIiCsGGkoiIKAQbSiIiohBsKImIiEKwoSQiIgrBhpKIiCgEG0oiIqIQoQ8cICKiiimjalUv7j5ug5N2V4OpXnzEzJO9uNLhf6e+YqWAZ5REREQh2FASERGFYENJREQUgmOUALIaN/LibW13ietvsucsdqZn39rKi2vP9J+rW3fWVidfxphfSlJFonJja599nOkqI3/2Yt2rkxfPO76ak++gQ3714jHfdo1ZfpPxBV5cecTEEteT/i04LjlncHsvHt5gsJOvMBAvnNbEi1uDY5REREQVDhtKIiKiEBWm63Xd2ft58epj3O7QW/YY5cXn1Pw8rvKGrGvhTJ9c4yMvrnNa5Zh/d1zT7nGVT1TWZdav58UF71bx4nfaPuHkW16Q7cW1MkZ7cYusqojp3B9iJq04e7MXL3m6kpN26YNXe3G9l8fHLp+imnt7Ny+e2ftpL+4792gn3+oHdvXi1qN+Sn3FShnPKImIiEKwoSQiIgpR7rteM7p19OLfr/KvohtzxFNOvgaZk/y/ScLxwYW1FkR8Eru7lWhnNGeQP/wwu8OQQIrbpdow04+fX9vOi3/e4A5fLNpUO+Z3ZYp/neVn7UdELRsA3h34mBdfNqu/k5Yxdioo3LaG+VE/nz6mrTO966iK1a3NM0oiIqIQbCiJiIhCsKEkIiIKUe7HKDftWsOL5xz9QiClyr8zJ+jFtf7Td978e+8SlVELfyarOhVCxu7+k1y2Nnaf5DL/RP8JSKfuM8lJ267+4NV3r/tPimny/Tonn/4yIyn1rAh0/27O9LsHvBSY8nclo7a4Y5QP33iuF9eYscpPWPmPky9jzcLY353hL892/3eFF888/RknX+vs6l68ZeB6J63Wef4TuPKXLY/5XRVZdvVtXryh0I9bfJVXGtUpM3hGSUREFIINJRERUYgy0/Wa1aypMz3r5mZe3Gic38VW8233KRAZeerFc7b7XQUL891LzZtnrfXi834710lbM8t/wkijSX55tce5XUG6caMX11rLLtRk0R67O9Nzr/Tjt/Z/2Yu7V4q4FyBeN/oPzt5ywzYnafBav2v3+Wk9DvHr7QAAIABJREFUnbS2F87y4sKt7tOcKqLttdyn4Oxeyd99FMLfbm589QInX/OPxnlxAUqo0P/LNtf6+4COldxbQKafMMiLv+/6gZPW4zC/y7bWG+x6BYDMNrs60zMOHurFVy851M/33c+oyHhGSUREFIINJRERUQg2lERERCFKdYwys3YtL97ns3lO2vD6n3hxj8nuOERQzkj/toAbjz3PiwtmzHa/q6P/CKa6s/9y0uoWzoladvSHOVFJFR7oj0XO94eL8FmP55x8rbOCt/b445JfbXFv+blt5olevHaBOyb924n+bQN3LPffHPNo48lOvm5V/BfNPrHPu07ardee58XNHhqHiq6gssRM223ceV7c4oH0/VZtr5zgTH96mP8S4dOqr3bS1h6/yYtrvZHaepUXs++O/djAdMo72r/dbkPz2M1SgynuLT86JT23d/GMkoiIKAQbSiIiohBp7XrNqOy+YSPvA7/r9bb63zpp7T/0++Y6fOSfXoddXh7Z3eqkzfojzlpSssx9y73t482Yt3q4XapnzTvciyf97l++3uHqWU6+Bpv85d0g4rsv636YF68Y0NKLr33BvcVkYKPRXjxmSxMnbWp/v/v2xDdO8OL8hYtQEbW/NXY3V+aUGjHT0un2SX53/Gm9hzhpV3b2Xwb9KeqkrU5l2ZP7vhsz7ce39vTixki8O/2vN/dwpgft+7YXd6001osbZebELOPP7e6A2AkfXOvFrW9I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\n",
      "text/plain": [
       "<Figure size 576x576 with 16 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "with tf.Session() as sess:\n",
    "    ckpt = tf.train.get_checkpoint_state('./')\n",
    "    if ckpt and ckpt.model_checkpoint_path:\n",
    "        saver.restore(sess, ckpt.model_checkpoint_path)\n",
    "        final_pred, acc = sess.run(\n",
    "            [pred, accuracy],\n",
    "            feed_dict={\n",
    "                x: mnist.test.images[:16],\n",
    "                y: mnist.test.labels[:16]\n",
    "            })\n",
    "        orders = np.argsort(final_pred)\n",
    "        plt.figure(figsize=(8, 8))\n",
    "        print(acc)\n",
    "        for idx in range(16):\n",
    "            order = orders[idx, :][-1]\n",
    "            prob = final_pred[idx, :][order]\n",
    "            plt.subplot(4, 4, idx + 1)\n",
    "            plt.axis('off')\n",
    "            plt.title('{}: [{}]-[{:.1f}%]'.format(mnist.test.labels[idx],\n",
    "                                                  order, prob * 100))\n",
    "            plt.imshow(mnist.test.images[idx].reshape((28, 28)))\n",
    "\n",
    "    else:\n",
    "        pass"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
